package main

//我们在数据库操作的时候，比如 dao 层中当遇到一个 sql.ErrNoRows 的时候，是否应该 Wrap 这个 error，抛给上层。为什么，应该怎么做请写出代码？
import (
	//"github.com/pkg/errors"
	"log"
	"database/sql"
	"errors"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	//"github.com/pkg/errors"
)

func TestErrWrap(rowid int) (string, error) {

	// 数据库连接
	db_conn := "username:pwd@tcp(localhost:3306)/smartx_test"
	db, err := sql.Open("mysql", db_conn)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	var fullname string
	//SELECT rowid,platform,fullname,val,address,tel FROM smartx_test.shopamap where fullname ='老甘家小龙虾';
	msql := fmt.Sprintf("SELECT fullname FROM smartx_test.shopamap where rowid=%d",rowid)
	err = db.QueryRow(msql).Scan(&fullname)
	if err != nil {
		if err == sql.ErrNoRows {
			fmt.Println("sql.ErrNoRows")
			return msql, fmt.Errorf("%w, data is nil", err)}
		log.Fatal(err)
	}
	//checkErr(err)
	return "", err
}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {
	res, err := TestErrWrap(1486749)
	//res, err := TestErrWrap(1486740)  //正确 id
	fmt.Printf("sql-> %s\n",res)
	err = errors.Unwrap(err)
	if errors.Is(err, sql.ErrNoRows) {
		fmt.Println(err.Error())
	}
}